<?php

declare(strict_types=1);

namespace app\admin\controller;

use think\Controller;
use think\Db;
use think\Request;
use think\Session;
use think\View;

/**
 * 后台基础控制器
 * Class BaseController
 */
class BaseController extends Controller
{
    /**
     * Request实例
     * @var Request
     */
    protected $request;

    /**
     * 构造方法
     */
    public function __construct()
    {
        parent::__construct();
        // 检查登录状态
        $this->checkLogin();
    }

    /**
     * 记录操作日志
     * 
     * @param string $action 操作动作
     * @param string $description 操作描述
     * @param array $data 操作数据
     * @param string $group 操作分组（默认：操作事件）
     * @return bool
     */
    protected function logOperation(string $action, string $description = '', array $data = [], string $group = '操作事件'): bool
    {
        try {
            // 如果没有提供描述，使用动作作为描述
            if (empty($description)) {
                $description = $action;
            }
            
            // 调用日志服务记录日志
            return \app\admin\service\OperationLogService::log($action, $group, $description, $data);
        } catch (\Exception $e) {
            // 记录日志失败不影响主业务
            error_log('Log operation failed: ' . $e->getMessage());
            return false;
        }
    }
    
    /**
     * 自动记录操作日志（简化版）
     * 
     * @param string $action 操作名称
     * @param string $description 操作描述
     * @return bool
     */
    protected function log(string $action, string $description = ''): bool
    {
        return $this->logOperation($action, $description);
    }
    
    /**
     * 记录数据变更日志
     * 
     * @param string $action 操作类型（新增、修改、删除）
     * @param string $module 模块名称
     * @param mixed $id 数据ID
     * @param array $data 变更的数据
     * @return bool
     */
    protected function logDataChange(string $action, string $module, $id = '', array $data = []): bool
    {
        $urlName = "{$module}{$action}";
        $description = "{$action}{$module}";
        
        if ($id) {
            $description .= "（ID: {$id}）";
        }
        
        return $this->logOperation($urlName, $description, $data);
    }

    /**
     * 检查登录状态
     */
    protected function checkLogin()
    {
        // 获取当前控制器名称
        $controller = request()->controller();

        // 如果不是登录控制器且未登录，则跳转到登录页
        if (!Session::has('admin_id') && strtolower($controller) != 'login') {
            // 如果是AJAX请求，返回JSON
            if (request()->isAjax()) {
                header('Content-Type: application/json');
                echo json_encode(['code' => 1, 'msg' => '请先登录', 'url' => '/admin/login']);
                exit;
            }
            // 普通请求重定向到登录页
            header('Location: /admin/login');
            exit;
        }
    }

    /**
     * 渲染视图
     */
    protected function fetch($template = '', $vars = [], $replace = [], $config = [])
    {
        return parent::fetch($template, $vars, $replace, $config);
    }

    /**
     * 返回成功消息
     * @param string $msg
     * @param string $url
     * @param mixed $data
     * @return array
     */
    protected function renderSuccess($msg = 'success', $url = null, $data = [])
    {
        return [
            'code' => 0,
            'msg'  => $msg,
            'url'  => $url,
            'data' => $data
        ];
    }

    /**
     * 返回错误消息
     * @param string $msg
     * @param string $url
     * @return array
     */
    protected function renderError($msg = 'error', $url = null)
    {
        return [
            'code' => 1,
            'msg'  => $msg,
            'url'  => $url,
        ];
    }

    /**
     * 错误跳转
     * @param string $msg 提示信息
     * @param string $url 跳转的URL
     * @param string $data 返回的数据
     * @param int $wait 跳转等待时间
     * @param array $header 发送的Header信息
     * @return mixed
     */
    public function error($msg = '', $url = null, $data = '', $wait = 3, array $header = [])
    {
        return parent::error($msg, $url, $data, $wait, $header);
    }
}
